package com.lingxu.base.system.manage.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lingxu.base.common.api.vo.Result;
import com.lingxu.base.common.api.vo.ResultTwo;
import com.lingxu.base.system.common.controller.LingXuController;
import com.lingxu.base.system.manage.entity.SysRole;
import com.lingxu.base.system.manage.entity.SysUser;
import com.lingxu.base.system.manage.entity.SysUserRoleQueryVo;
import com.lingxu.base.system.manage.service.ISysRoleMenuService;
import com.lingxu.base.system.manage.service.ISysRoleService;
import com.lingxu.base.system.manage.service.ISysUserRoleService;
import com.lingxu.base.system.manage.service.ISysUserService;
import com.lingxu.base.system.manage.vo.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @Description: 角色信息
 * @Author: LingXu
 * @Date:   2021-01-04
 * @Version: V1.0.1
 */
@Slf4j
@Api(tags="角色信息")
@RestController
@RequestMapping("/system/manage/sysRole")
public class SysRoleController extends LingXuController<SysRole,ISysRoleService> {
	@Resource
	private ISysRoleService sysRoleService;

	@Resource
	private ISysRoleMenuService sysRoleMenuService;

	@Resource
	private ISysUserRoleService sysUserRoleService;

	@Resource
	private ISysUserService sysUserService;



	@ApiOperation(value="角色信息-角色管理-用户信息-获取已拥有某角色的用户ids", notes="角色信息-角色管理-用户信息-获取已拥有某角色的用户ids")
	@PostMapping(value = "/roleHavingUserList")
	public Result<String> getRoleHavingUserList(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId){
		List<String> userIds=sysUserRoleService.getRoleHavingUserList(roleId);
		return Result.ok(userIds);
	}

	/**
	 * 角色信息-系统管理-为角色分配所有菜单
	 *
	 * @return 角色信息-系统管理-为角色分配所有菜单
	 */
	@ApiOperation(value="角色信息-系统管理-为角色分配所有菜单", notes="角色信息-系统管理-为角色分配所有菜单")
	@PostMapping("/distributeRoleMenusAll")
	public Result<?> distributeRoleMenusAll(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId){
		sysRoleMenuService.distributeRoleMenusAll(roleId);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色分配菜单
	 *
	 * @return 角色信息-系统管理-为角色分配菜单
	 */
	@ApiOperation(value="角色信息-系统管理-为角色分配菜单", notes="角色信息-系统管理-为角色分配菜单")
	@PostMapping("/distributeRoleMenus")
	public Result<?> distributeRoleMenus(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId,@RequestParam(name="menuIds")@ApiParam(value = "功能ids",required = true) String menuIds){
		String[] menuIdStr = menuIds.split(",");
		List<String> menuIdList = Arrays.asList(menuIdStr);
		sysRoleMenuService.distributeRoleMenus(roleId,menuIdList);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色取消菜单
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色取消菜单", notes="角色信息-系统管理-为角色取消菜单")
	@PostMapping("/cancelRoleMenus")
	public Result<?> cancelRoleMenus(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId,@RequestParam(name="menuIds")@ApiParam(value = "功能ids",required = true) String menuIds){
		sysRoleMenuService.cancelRoleMenus(roleId,menuIds);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色取消所有菜单
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色取消所有菜单", notes="角色信息-系统管理-为角色取消所有菜单")
	@PostMapping("/cancelRoleMenusAll")
	public Result<?> cancelRoleMenusAll(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId){
		sysRoleMenuService.cancelRoleMenusAll(roleId);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色分配所有用户
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色分配所有用户", notes="角色信息-系统管理-为角色分配所有用户")
	@PostMapping("/distributeRoleUsersAll")
	public Result<?> distributeRoleUsersAll(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId){
		sysUserRoleService.distributeRoleUsersAll(roleId);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色分配用户
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色分配用户", notes="角色信息-系统管理-为角色分配用户")
	@PostMapping("/distributeRoleUsers")
	public Result<?> distributeRoleUsers(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId,@RequestParam(name="userIds")@ApiParam(value = "用户ids",required = true) String userIds){
		String[] userIdStr = userIds.split(",");
		List<String> userIdList = Arrays.asList(userIdStr);
		sysUserRoleService.distributeRoleUsers(roleId,userIdList);
		return Result.ok("分配成功");
	}

	/**
	 * 角色信息-系统管理-为角色取消用户
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色取消用户", notes="角色信息-系统管理-为角色取消用户")
	@PostMapping("/cancelRoleUsers")
	public Result<?> cancelRoleUsers(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId,@RequestParam(name="userIds")@ApiParam(value = "用户ids",required = true) String userIds){
		sysUserRoleService.cancelRoleUsers(roleId,userIds);
		return Result.ok("取消成功");
	}

	/**
	 * 角色信息-系统管理-为角色取消所有用户
	 *
	 * @return
	 */
	@ApiOperation(value="角色信息-系统管理-为角色取消所有用户", notes="角色信息-系统管理-为角色取消所有用户")
	@PostMapping("/cancelRoleUsersAll")
	public Result<?> cancelRoleUsersAll(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true) String roleId){
		sysUserRoleService.cancelRoleUsersAll(roleId);
		return Result.ok("取消成功");
	}


	/**
	 * 角色信息-系统管理-查询角色列表
	 * @return
	 */
	@ApiOperation(value = "角色信息-系统管理-查询角色列表", notes="角色信息-系统管理-查询角色列表")
	@PostMapping("/allRelatedRoleList")
	public Result<SysRole> listByOrgId(){
		List<SysRole> roleList=sysRoleService.queryList();
		return Result.ok(roleList);
	}


	/**
	 * 角色信息-系统管理-通过用户查询角色列表
	 * @return
	 */
	@ApiOperation(value = "角色信息-系统管理-通过用户查询角色列表", notes="角色信息-系统管理-通过用户查询角色列表")
	@PostMapping("/getUserRoleList")
	public ResultTwo<SysRole> getUserRoleList(String userId){
		//包含
		List<SysRole> roleList = sysRoleService.getUserRoleList(userId,1);
		//不包含
		List<SysRole> roleList2 = sysRoleService.getUserRoleList(userId,0);
		return ResultTwo.ok(roleList,roleList2);
	}



	/**
	 * 添加
	 *
	 * @param sysRole
	 * @return
	 */
	@ApiOperation(value="角色信息-添加", notes="角色信息-添加")
	@PostMapping(value = "/add")
	public Result<?> add(@RequestBody SysRole sysRole) {
		LoginUser userNow = (LoginUser) SecurityUtils.getSubject().getPrincipal();
		sysRole.setCreateby(userNow.getId());
		sysRole.setIsdel("0");
		sysRole.setCreatetime(new Date());

		sysRoleService.save(sysRole);
		return Result.ok("添加成功！");
	}

	/**
	 * 编辑
	 *
	 * @param sysRole
	 * @return
	 */
	@ApiOperation(value="角色信息-编辑", notes="角色信息-编辑")
	@PostMapping(value = "/edit")
	public Result<?> edit(@RequestBody SysRole sysRole) {
		sysRoleService.updateById(sysRole);
		return Result.ok("编辑成功!");
	}

	/**
	 * 通过id删除
	 *
	 * @param id 角色id
	 * @return
	 */
	@ApiOperation(value="角色信息-通过id删除", notes="角色信息-通过id删除")
	@PostMapping(value = "/delete")
	public Result<?> delete(@RequestParam(name="id")@ApiParam(value = "角色id") String id) {
		sysRoleService.removeById(id);
		return Result.ok("删除成功!");
	}

	/**
	 * 批量删除
	 *
	 * @param ids 一批角色id
	 * @return
	 */
	@ApiOperation(value="角色信息-批量删除", notes="角色信息-批量删除")
	@PostMapping(value = "/deleteBatch")
	public Result<?> deleteBatch(@RequestParam(name="ids")@ApiParam(value = "角色id（多个用逗号','隔开）") String ids) {
		if(StringUtils.isNotBlank(ids)){
			this.sysRoleService.removeByIds(Arrays.asList(ids.split(",")));
			return Result.ok("批量删除成功！");
		}else{
			return Result.error("未传待删除数据");
		}

	}

	/**
	 * 通过id查询
	 *
	 * @param id
	 * @return
	 */
	@ApiOperation(value="角色信息-通过id查询", notes="角色信息-通过id查询")
	@PostMapping(value = "/queryById")
	public Result<SysRole> queryById(@RequestParam(name="id")@ApiParam(value = "角色id") String id) {
		SysRole sysRole = sysRoleService.getById(id);
		return Result.ok(sysRole);
	}

	@ApiOperation(value="角色信息-通过角色id查询用户信息", notes="角色信息-通过角色id查询用户信息")
	@PostMapping(value = "/getSysUserByRole")
	public Result<?> getSysUserByRole(@RequestBody SysUserRoleQueryVo vo) {
		Page<SysUser> page = new Page<>(vo.getPageNo(), vo.getPageSize());
		IPage<SysUser> pageList = sysRoleService.getSysUserByRole(page, vo);
		return Result.ok(pageList);
	}

	@ApiOperation(value = "角色信息-系统管理-通过角色查询用户列表", notes="角色信息-系统管理-通过角色查询用户列表")
	@PostMapping("/getRoleUserList")
	public Result<SysUser> getRoleUserList(@RequestParam(name="roleId")@ApiParam(value = "角色id",required = true)String roleId){
		//包含
		List<SysUser> userList = sysUserService.getRoleUserList(roleId,1);
		//不包含
		//List<SysUser> userList2 = sysUserService.getRoleUserList(roleId,0);
		return Result.ok(userList);
	}




}
